package com.tyc.waitnotify;


import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

/**
 * aqs使用LockSupport来使得指定线程睡眠/唤醒
 * 调用了Unsafe类
 *  使用带有参数的park 便于线程监控和分析工具来定位原因
 * 特性
 *  与wait和notify相比它不需要先获得锁对象，可以唤醒一个指定的线程
 *  park()、unpark()的执行不分先后顺序，unpark连续调用多次也只是分配一个许可证,park每次消耗一个
 *  park()会去判断中断状态，如果为true，就不阻塞继续往下执行，并不会抛出异常,不清除中断标志
 */
public class LockSupportTest {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            try {
                System.out.println("进入睡眠");
                LockSupport.park();
                System.out.println(Thread.currentThread().isInterrupted());
                //清除线程中断标志
                Thread.interrupted();
                System.out.println(Thread.currentThread().isInterrupted());
                LockSupport.unpark(Thread.currentThread());
                LockSupport.park();
                System.out.println("---------<>-------");
                LockSupport.park();
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        thread.start();
        TimeUnit.SECONDS.sleep(1);
        thread.interrupt();
        thread.join();
    }
}
